/**
 * 
 */
package Proj1;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *Cursos da Escola 
 * @author Leonardo e Mikaelle
 */
public class Curso {
	
	/**
	 * Nome do Curso
	 */
	private String nome;
	/**
	 * Lista de Alunos pertencentes ao curso
	 */
	private ArrayList<Aluno> alunos = new ArrayList<Aluno>();
	/**
	 * Lista de professores pertencentes ao curso
	 */
	private ArrayList<Professor> professores = new ArrayList<Professor>();
	/**
	 * Lista de turmas pertencentes ao curso
	 */
	private ArrayList<Turma> turmas = new ArrayList<Turma>();

	/**
	 * Pega turmas do curso
	 * 
	 * @return turmas
	 * @throws SQLException 
	 */
	public ArrayList<Turma> getTurmas(String curso) throws SQLException {
		ResultSet res = BancoDeDados.query("SELECT * FROM TURMAS t where t.curso = "+curso);
		turmas = new ArrayList<Turma>();
		while(res.next()){
			Turma turma = new Turma(res.getString("nome"), res.getString("professor"));
			turmas.add(turma);
		}
		return turmas;
	}

	/**
	 * Pega professores do curso
	 * 
	 * @return professores
	 * @throws SQLException 
	 */
	public ArrayList<Professor> getProfessores(String curso) throws SQLException {
		ResultSet res = BancoDeDados.query("SELECT p.matricula, p.nome, p.endereco FROM PROFESSORES p, PROFESSORES_CURSOS pc where p.matricula = pc.professor and pc.curso = "+curso);
		professores = new ArrayList<Professor>();
		while(res.next()){
			Professor professor = new Professor(res.getInt("matricula"), res.getString("nome"), res.getString("endereco"));
			professores.add(professor);
		}
		return professores;
	}

	/**
	 * Pega alunos do curso
	 * 
	 * @return alunos
	 * @throws SQLException 
	 */
	public ArrayList<Aluno> getAlunos(String curso) throws SQLException {
		this.alunos = new ArrayList<Aluno>();
		ResultSet res = BancoDeDados.query("SELECT a.matricula, a.nome, a.endereco FROM alunos a, ALUNOS_CURSOS ac where a.matricula = al.curso and al.curso = "+curso);
		while(res.next()){
			Aluno aluno = new Aluno(res.getInt("matricula"), res.getString("nome"), res.getString("endereco"));
			alunos.add(aluno);
		}
		return alunos;
	}
	/**
	 * Pega o nome do curso
	 * 
	 * @return nome Nome do curso
	 */	
	public String getNome() {		
		return this.nome;
	}
		
	public String getNome(String nome) {		
		return nome;
	}

	/**
	 * Altera o nome do curso
	 * 
	 * @param nome
	 *            Nome do curso
	 * @return true
	 */
	public boolean setNome(String orig_nome, String nov_nome) {
		return BancoDeDados.queryUpdate("update Cursos set nome = "+nov_nome+" where nome = "+orig_nome);		
	}

	/**
	 * Metodo para cadastrar um aluno no curso
	 * 
	 * @param aluno
	 *            Objeto aluno
	 * @return true Se o aluno pertencer a escola ele sera cadastrado com
	 *         sucesso caso contrario retorna false.
	 * @throws SQLException 
	 */
	public boolean cadastAluno(String curso, String matricula) throws SQLException {
		PreparedStatement pstm = BancoDeDados.getConexao().prepareStatement("insert into alunos_cursos (curso, Aluno) values (?, ?)");		
		pstm.setString(1, curso);
		pstm.setString(2, matricula);
		pstm.executeUpdate();
		return true;		
		//return BancoDeDados.queryUpdate("insert into alunos_cursos (curso, aluno) values ('"+curso+"', '"+matricula+"')");
	}

	/**
	 * Metodo para cadastrar um professor no curso
	 * 
	 * @param professor
	 *            Objeto professor
	 * @return true Se o professor pertencer a escola ele sera cadastardo com
	 *         sucesso caso contrario retorna false.
	 * @throws SQLException 
	 */
	public boolean cadastProfessor(String curso, String matricula) throws SQLException {
		PreparedStatement pstm = BancoDeDados.getConexao().prepareStatement("insert into professores_cursos (curso, Professor) values (?, ?)");		
		pstm.setString(1, curso);
		pstm.setString(2, matricula);
		pstm.executeUpdate();
		return true;
		//return BancoDeDados.queryUpdate("insert into profesores_cursos (curso, aluno) values ('"+curso+"', '"+matricula+"')");
	}

	/**
	 * Metodo para pesquisar um professor no curso
	 * 
	 * @param professor
	 *            Objeto professor
	 * @return true Se o professor for encontrado retorna true caso contrario
	 *         retorna false.
	 * @throws SQLException 
	 */
	public Professor pesqProf(String matricula) throws SQLException {
		Professor professor = null;
		ResultSet res = BancoDeDados.query("SELECT a.matricula, a.nome, a.endereco  FROM professores a, professores_cursos al where al.professor = "+matricula);		
		while(res.next()){
			professor = new Professor(res.getInt("matricula"), res.getString("nome"), res.getString("endereco"));
		}
		return professor;
	}

/**
 * Metodo para pesquisar um aluno no curso passada sua matricula
 * @param matricula Matricula do aluno
 * @return res
 * @throws SQLException 
 */
	public Aluno pesqAluno(String curso, String matricula) throws SQLException {
		Aluno aluno = null;
		ResultSet res = BancoDeDados.query("SELECT a.matricula, a.nome, a.endereco  FROM alunos a, alunos_cursos al where al.aluno = "+matricula);		
		while(res.next()){
			 aluno = new Aluno(res.getInt("matricula"), res.getString("nome"), res.getString("endereco"));
		}
		return aluno;
	}

	/**
	 * Metodo para cadastrar uma turma ao curso
	 * 
	 * @param nome
	 *            Nome da turma
	 * @param professor
	 *            Professor responsavel pela turma
	 * @return true Se a turma for cadastrada com sucesso retorna true caso
	 *         contrario retorna false.
	 * @throws SQLException 
	 */

	public boolean cadastTurma(String nome, String curso, String matricula) throws SQLException {		
		PreparedStatement pstm = BancoDeDados.getConexao().prepareStatement("insert into turmas (nome, curso, professor) values (?, ?, ?)");
		pstm.setString(1, nome);
		pstm.setString(2, curso);
		pstm.setString(3, matricula);
		pstm.executeUpdate();
		return true;
		//return BancoDeDados.getConexao().get.queryUpdate("insert into turmas (nome, curso, professor) values ('"+nome+"', '"+curso+"', '"+matricula+"')");
	}

	/**
	 * Metodo para pesquisar uma turma no curso
	 * 
	 * @param turma
	 * @return true Se a turma for encontrada retorna true caso contrario
	 *         retorna false.
	 * @throws SQLException 
	 */
	public Turma pesqTurma(String nome) throws SQLException {
		Turma turma = null;
		ResultSet res = BancoDeDados.query("SELECT t.nome, t.curso, t.professor  FROM turmas t where t.nome = "+nome);		
		while(res.next()){
			 turma = new Turma(res.getString("nome"), res.getString("Professor"));
		}
		return turma;
	}
/**
 * Metodo para remover um professor do curso passada sua matricula
 * @param matricula Matricula do professor
 * @return true
 */
	public boolean delProf(String matricula) {
		return BancoDeDados.queryUpdate("delete from profesores_cursos where matricula = "+matricula);
	}

	/**
	 * Metodo para deletar alunos da turma passado sua matricula
	 * 
	 * @param matricula
	 *            Matricula do aluno que se deseja remover
	 * @return true Se o aluno for encontrado ele sera removido caso contrario
	 *         retorna false.
	 */
	public boolean delAluno(String matricula) {
		return BancoDeDados.queryUpdate("delete from alunos_cursos where matricula = "+matricula);
	}

	/**
	 * Metodo para deletar uma turma pelo nome
	 * 
	 * @param nome
	 *            Nome da turma
	 * @return true
	 */
	public boolean delTurma(String nome) {
		return BancoDeDados.queryUpdate("delete from turmas where nome = "+nome);
	}
	
	/**
	 * Construtor explicito do curso
	 * 
	 * @param escola
	 * @param nome
	 */
	public Curso(String nome) {
		super();
		this.nome = nome;
		this.alunos = new ArrayList<Aluno>();
		this.professores = new ArrayList<Professor>();
		this.turmas = new ArrayList<Turma>();
	}

	/**
	 * Construtor default
	 */
	public Curso() {
		super();
		this.alunos = new ArrayList<Aluno>();
		this.professores = new ArrayList<Professor>();
		this.turmas = new ArrayList<Turma>();
	}
}